

//验证统一信用代码证号
export function checkCreditCode(rule, value, callback) {
  var reg = /^([159Y]{1})([1239]{1})([0-9]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9ABCDEFGHJKLMNPQRTUWXY]{1})$/;
  if (value === "") {
    callback(new Error("社会信用代码不能为空！"));
  } else if (value !== "") {
    if (value.length != 18) {
      callback(new Error("社会信用代码长度错误！"));
    } else {
      if (!reg.test(value)) {
        callback(new Error("社会信用代码校验错误！"));
      } else {
        var str = "0123456789ABCDEFGHJKLMNPQRTUWXY";
        var ws = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
        var codes = new Array();
        codes[0] = value.substr(0, value.length - 1);
        codes[1] = value.substr(value.length - 1, value.length);
        var sum = 0;
        for (var i = 0; i < 17; i++) {
          sum += str.indexOf(codes[0].charAt(i)) * ws[i];
        }

        var indexOfc18 = 31 - (sum % 31);
        var c18 = str.charAt(indexOfc18 % 31);
        if (c18 != codes[1]) {
          callback(new Error("校验位错误！" + c18));
        } else {
          callback();
        }
      }
    }
  } else {
    callback();
  }
}

/* 校验固定电话 */
export function checkPhone(rule, value, callback) {
  let reg = /^\d{3}-\d{7,8}|\d{4}-\d{7,8}$/
  value = value.trim()
  if(reg.test(value)) {
    callback();
  }
  else {
    callback(new Error("请输入正确的固定电话"));
  }
}

/* 校验身份证号 */
export function checkIdCode(id) {
   // 1 "验证通过!", 0 //校验不通过 // id为身份证号码
    let format = /^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/;
    //号码规则校验
    if(!format.test(id)){
      return {'status':0,'msg':'身份证号码不合规'};
    }
    //区位码校验
    //出生年月日校验  前正则限制起始年份为1900;
    let year = id.substr(6,4),//身份证年
      month = id.substr(10,2),//身份证月
      date = id.substr(12,2),//身份证日
      time = Date.parse(month+'-'+date+'-'+year),//身份证日期时间戳date
      now_time = Date.parse(new Date()),//当前时间戳
      dates = (new Date(year,month,0)).getDate();//身份证当月天数
    if(time>now_time||date>dates){
      return {'status':0,'msg':'出生日期不合规'}
    }
    //校验码判断
    let c = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);  //系数
    let b = new Array('1','0','X','9','8','7','6','5','4','3','2'); //校验码对照表
    let id_array = id.split("");
    let sum = 0;
    for(let k=0;k<17;k++){
      sum+=parseInt(id_array[k])*parseInt(c[k]);
    }
    if(id_array[17].toUpperCase() != b[sum%11].toUpperCase()){
      return {'status':0,'msg':'身份证校验码不合规'}
    }
    return {'status':1,'msg':'校验通过'}
}

/* 校验邮箱 */
export function checkEmail(email) {
  let reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
  return reg.test(email)
}

/* 校验用户名 */
export function checkUserName(name) {
    const reg = /^[a-zA-Z0-9]+$/
    const reg2 = /^.{4,18}$/
    // 长度为6到18个字符
    if (name === '') {
        return {'status': 0,'msg':'不能为空'}
    } else if (name !== '' && !reg.test(name)) {
        return {'status': 0,'msg':'只允许字母、数字组成'}
    } else {
        return {'status': 1,'msg':'校验通过'}
    }
}

/* 校验手机号 */
export function checkMobile(mobile) {
  let reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/
  return reg.test(mobile)
}

/* 校验密码强度 */
export function passwordValid(userName, pass) {
  let passLower = pass.toLocaleLowerCase();
  let flag = " ";
  if (
    pass === null ||
    pass.length < 8 ||
    pass.length > 20 ||
    pass.length === ""
  ) {
    flag = "密码位数不对，长度最少8位，最大20位";
    return flag;
  }

  // 判断是否默认密码
  // if (isDefaultPass(userName, pass))
  // {
  // return "密码为默认密码或弱口令";
  // }

  // 是数字
  let isDigit = /^.*[0-9]+.*/;
  // isLowerCase 小写字母
  let isLowerCase = /^.*[a-z]+.*/;
  // isUpperCase 大写字母
  let isUpperCase = /^.*[A-Z]+.*/;
  // 特殊字符
  let regEx = /^.*[^a-zA-Z0-9]+.*/;
  // 记录匹配的次数
  let num = 0;
  if (isDigit.test(pass)) {
    num = num + 1;
  }
  if (isLowerCase.test(pass)) {
    num = num + 1;
  }
  if (isUpperCase.test(pass)) {
    num = num + 1;
  }
  if (regEx.test(pass)) {
    num = num + 1;
  }
  if (num <= 2) {
    flag =
      "密码复杂度不足,\n(1)大写字母\n(2)小写字母\n(3)数字\n(4)特殊符号\n密码至少需包含上述情形中的三种";
    return flag;
  }

  //新密码中不能够包含帐户。
  if (pass.indexOf(userName) >= 0) {
    flag = "新密码不能包含用户名";
    return flag;
  }

  //密码中不能包含有连续四位及以上顺序(或逆序)数字(如：密码中不能包含1234或3210等)。
  let numberSequence = false;
  for (let i = 0; i < pass.length - 3; i++) {
    if (
      !isDigit.test(pass.substring(i, i + 1)) ||
      !isDigit.test(pass.substring(i + 1, i + 2) + "") ||
      !isDigit.test(pass.substring(i + 2, i + 3) + "") ||
      !isDigit.test(pass.substring(i + 3, i + 4) + "")
    ) {
      continue;
    }
    let no1 = Number(pass.substring(i, i + 1));
    let no2 = Number(pass.substring(i + 1, i + 2));
    let no3 = Number(pass.substring(i + 2, i + 3));
    let no4 = Number(pass.substring(i + 3, i + 4));
    if (no1 + 1 === no2 && no2 + 1 === no3 && no3 + 1 === no4) {
      numberSequence = true;
    }
    if (no2 + 1 === no1 && no3 + 1 === no2 && no4 + 1 === no3) {
      numberSequence = true;
    }
  }

  if (numberSequence) {
    flag =
      "密码中不能包含有连续四位及以上顺序(或逆序)数字";
    return flag;
  }

  //密码中不能包含有连续四位及以上顺序(或逆序)字母，字母不区分大小写(如：密码中不能包含abcd或ABCD或AbcD或DcbA等)。
  let letterSequence = false;
  for (let i = 0; i < passLower.length - 3; i++) {
    if (
      !isLowerCase.test(passLower.substring(i, i + 1)) ||
      !isLowerCase.test(passLower.substring(i + 1, i + 2) + "") ||
      !isLowerCase.test(passLower.substring(i + 2, i + 3) + "") ||
      !isLowerCase.test(passLower.substring(i + 3, i + 4) + "")
    ) {
      continue;
    }
    let no1 = passLower.charAt(i).charCodeAt() + 0;
    let no2 = passLower.charAt(i + 1).charCodeAt() + 0;
    let no3 = passLower.charAt(i + 2).charCodeAt() + 0;
    let no4 = passLower.charAt(i + 3).charCodeAt() + 0;
    if (no1 + 1 === no2 && no2 + 1 === no3 && no3 + 1 === no4) {
      letterSequence = true;
    }
    if (no2 + 1 === no1 && no3 + 1 === no2 && no4 + 1 === no3) {
      letterSequence = true;
    }
  }

  if (letterSequence) {
    flag = "密码中不能包含有连续四位及以上顺序(或逆序)字母";
    return flag;
  }

  //密码中不能包含有连续四位及以上重复字符，字母不区分大小写(如：密码中不能包含8888、aaaa 或AAAA或BbbB或 $$$$等四位及以上的重复字符)。
  let fourOrMoreSame = false;
  for (let i = 0; i < pass.length - 3; i++) {
    if (
      passLower.charAt(i) === passLower.charAt(i + 1) &&
      passLower.charAt(i + 1) === passLower.charAt(i + 2) &&
      passLower.charAt(i + 2) === passLower.charAt(i + 3)
    ) {
      fourOrMoreSame = true;
    }
  }
  if (fourOrMoreSame) {
    flag =
      // "密码中不能包含有连续四位及以上重复字符，字母不区分大小写(如：密码中不能包含8888、aaaa 或AAAA或BbbB或 $$$$等四位及以上的重复字符";
      "密码中不能包含有连续四位及以上重复字符";
    return flag;
  }
  let cont = /^.*admin.*$/;
  let cont2 = /^.*pass.*$/;
  //禁忌词不区分大小写不能作为密码的一部分存在于密码中(如：admin, pass)。
  if (cont.test(passLower) || cont2.test(passLower)) {
    flag = "禁忌词不区分大小写不能作为密码的一部分存在于密码中(如：admin, pass)";
    return flag;
  }
  return "correct";
}
